package org.corespring.restaurant.service.impl;

import java.util.Arrays;
import java.util.Iterator;
import java.util.List;

import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFCellStyle;
import org.apache.poi.hssf.usermodel.HSSFRichTextString;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.hssf.util.HSSFColor;
import org.corespring.restaurant.dao.IngredienteDao;
import org.corespring.restaurant.dao.MenuDao;
import org.corespring.restaurant.dao.PlatoDao;
import org.corespring.restaurant.dao.PlatoMenuDao;
import org.corespring.restaurant.dao.RecetaDao;
import org.corespring.restaurant.model.Ingrediente;
import org.corespring.restaurant.model.Menu;
import org.corespring.restaurant.model.Plato;
import org.corespring.restaurant.model.Receta;
import org.corespring.restaurant.service.ReporteManager;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

@Service
public class ReporteManagerImpl implements ReporteManager {

    @Autowired
    MenuDao menuDao;
    @Autowired
    PlatoMenuDao platomenuDao;
    @Autowired
    RecetaDao recetaDao;

    @Autowired
    PlatoDao platoDao;

    @Autowired
    IngredienteDao ingredienteDao;

    public HSSFWorkbook obtenerListaMenuReporte() {
        //List<Map<String, Object>> lista = reporteDao.obtenerListaMenusParaReporte();
        HSSFWorkbook workbook = generarMenuReporteExcel();
        return workbook;
    }

    public HSSFWorkbook obtenerListaRecetaReporte() {
        //List<Map<String, Object>> lista = reporteDao.obtenerListaMenusParaReporte();
        HSSFWorkbook workbook = generarRecetaReporteExcel();
        return workbook;
    }

    public HSSFWorkbook obtenerListaPlatosReporte() {
        
        HSSFWorkbook workbook = generarPlatosReporteExcel();
        return workbook;
    }

    public HSSFWorkbook obtenerListaIngredientesReporte() {
        
        HSSFWorkbook workbook = generarIngredientesReporteExcel();
        return workbook;
    }

    @SuppressWarnings({"finally", "deprecation"})
    public HSSFWorkbook generarMenuReporteExcel() {
        HSSFWorkbook workbook = new HSSFWorkbook();
        HSSFSheet sheet = workbook.createSheet("Reporte");
        int fila = 1;
        int columna = 0;
        try {

            HSSFCellStyle estiloCabecera = workbook.createCellStyle();
            estiloCabecera.setAlignment(HSSFCellStyle.ALIGN_CENTER);
            estiloCabecera.setFillForegroundColor(HSSFColor.BLACK.index);
            estiloCabecera.setFillBackgroundColor(HSSFColor.WHITE.index);
            //estiloCabecera.setFillPattern(HSSFCellStyle.BORDER_THIN);
            //estiloCabecera.setBorderBottom(HSSFCellStyle.BORDER_THIN);

            String[] arregloCabecera = new String[]{"CODIGO", "FECHA", "COSTO", "PRECIO"};

            HSSFRow row = sheet.createRow((short) fila++);
            HSSFCell cell = null;
            for (Iterator<String> iter = Arrays.asList(arregloCabecera).iterator(); iter.hasNext();) {
                String string = iter.next();

                cell = row.createCell((short) columna++);
                cell.setCellStyle(estiloCabecera);
                cell.setCellValue(new HSSFRichTextString(string));
            }

            List<Menu> listamenu = menuDao.obtenerListaMenus();
            //No tiene porque generar lo demas si no hay datos
            if (listamenu.size() == 1) {
                return workbook;
            }

            HSSFCellStyle estiloCelda = workbook.createCellStyle();
            estiloCelda.setAlignment(HSSFCellStyle.ALIGN_RIGHT);


            for (Menu m : listamenu) {
                row = sheet.createRow((short) fila++);
                columna = 0;
                String codigo = m.getIdmenu();
                cell = row.createCell((short) columna++);
                cell.setCellStyle(estiloCelda);
                cell.setCellValue(new HSSFRichTextString(codigo));

                String fecha = m.getFecha().toString();
                cell = row.createCell((short) columna++);
                cell.setCellStyle(estiloCelda);
                cell.setCellValue(new HSSFRichTextString(fecha));

                String costo = m.getCosto().toString();
                cell = row.createCell((short) columna++);
                cell.setCellStyle(estiloCelda);
                cell.setCellValue(new HSSFRichTextString(costo));

                String precio = m.getPrecio().toString();
                cell = row.createCell((short) columna++);
                cell.setCellStyle(estiloCelda);
                cell.setCellValue(new HSSFRichTextString(precio));
            }
        } catch (Exception e) {
            HSSFRow row = sheet.createRow((short) fila++);
            HSSFCell cell = row.createCell((short) 0);
            cell.setCellValue(new HSSFRichTextString(e.getMessage()));
        } finally {
            return workbook;
        }
    }

    @SuppressWarnings({"finally", "deprecation"})
    public HSSFWorkbook generarRecetaReporteExcel() {
        HSSFWorkbook workbook = new HSSFWorkbook();
        HSSFSheet sheet = workbook.createSheet("Reporte");
        int fila = 1;
        int columna = 0;
        try {

            HSSFCellStyle estiloCabecera = workbook.createCellStyle();
            estiloCabecera.setAlignment(HSSFCellStyle.ALIGN_CENTER);
            estiloCabecera.setFillForegroundColor(HSSFColor.BLACK.index);
            estiloCabecera.setFillBackgroundColor(HSSFColor.WHITE.index);
            //estiloCabecera.setFillPattern(HSSFCellStyle.BORDER_THIN);
            //estiloCabecera.setBorderBottom(HSSFCellStyle.BORDER_THIN);

            String[] arregloCabecera = new String[]{"PLATO", "INGREDIENTE", "CANTIDAD", "UNIDAD"};

            HSSFRow row = sheet.createRow((short) fila++);
            HSSFCell cell = null;
            for (Iterator<String> iter = Arrays.asList(arregloCabecera).iterator(); iter.hasNext();) {
                String string = iter.next();

                cell = row.createCell((short) columna++);
                cell.setCellStyle(estiloCabecera);
                cell.setCellValue(new HSSFRichTextString(string));
            }

            List<Receta> recetas = recetaDao.obtenerRecetas();
            //No tiene porque generar lo demas si no hay datos
            if (recetas.size() == 1) {
                return workbook;
            }

            HSSFCellStyle estiloCelda = workbook.createCellStyle();
            estiloCelda.setAlignment(HSSFCellStyle.ALIGN_RIGHT);


            for (Receta r : recetas) {
                row = sheet.createRow((short) fila++);
                columna = 0;
                String plato = r.getPlato().getNomplato();
                cell = row.createCell((short) columna++);
                cell.setCellStyle(estiloCelda);
                cell.setCellValue(new HSSFRichTextString(plato));

                String ingred = r.getIngrediente().getDesing().toString();
                cell = row.createCell((short) columna++);
                cell.setCellStyle(estiloCelda);
                cell.setCellValue(new HSSFRichTextString(ingred));

                String cantidad = String.valueOf(r.getCantidad());
                cell = row.createCell((short) columna++);
                cell.setCellStyle(estiloCelda);
                cell.setCellValue(new HSSFRichTextString(cantidad));

                String unidad = r.getIngrediente().getUnidad().getUnicod().toString();
                cell = row.createCell((short) columna++);
                cell.setCellStyle(estiloCelda);
                cell.setCellValue(new HSSFRichTextString(unidad));
            }
        } catch (Exception e) {
            HSSFRow row = sheet.createRow((short) fila++);
            HSSFCell cell = row.createCell((short) 0);
            cell.setCellValue(new HSSFRichTextString(e.getMessage()));
        } finally {
            return workbook;
        }
    }


    @SuppressWarnings({"finally", "deprecation"})
    public HSSFWorkbook generarPlatosReporteExcel() {
        HSSFWorkbook workbook = new HSSFWorkbook();
        HSSFSheet sheet = workbook.createSheet("Reporte");
        int fila = 1;
        int columna = 0;
        try {

            HSSFCellStyle estiloCabecera = workbook.createCellStyle();
            estiloCabecera.setAlignment(HSSFCellStyle.ALIGN_CENTER);
            estiloCabecera.setFillForegroundColor(HSSFColor.BLACK.index);
            estiloCabecera.setFillBackgroundColor(HSSFColor.WHITE.index);
            //estiloCabecera.setFillPattern(HSSFCellStyle.BORDER_THIN);
            //estiloCabecera.setBorderBottom(HSSFCellStyle.BORDER_THIN);

            String[] arregloCabecera = new String[]{"CODIGO", "DESCRIPCION", "COSTO", "PRECIO", "TIPO","CATEGORIA"};

            HSSFRow row = sheet.createRow((short) fila++);
            HSSFCell cell = null;
            for (Iterator<String> iter = Arrays.asList(arregloCabecera).iterator(); iter.hasNext();) {
                String string = iter.next();

                cell = row.createCell((short) columna++);
                cell.setCellStyle(estiloCabecera);
                cell.setCellValue(new HSSFRichTextString(string));
            }

            List<Plato> platos = platoDao.obtenerListaPlatos();
            //No tiene porque generar lo demas si no hay datos
            if (platos.size() == 1) {
                return workbook;
            }

            HSSFCellStyle estiloCelda = workbook.createCellStyle();
            estiloCelda.setAlignment(HSSFCellStyle.ALIGN_RIGHT);


            for (Plato p : platos) {
                row = sheet.createRow((short) fila++);
                columna = 0;
                String codigo = p.getIdplato().toString();
                cell = row.createCell((short) columna++);
                cell.setCellStyle(estiloCelda);
                cell.setCellValue(new HSSFRichTextString(codigo));

                String descrip = p.getNomplato().toString();
                cell = row.createCell((short) columna++);
                cell.setCellStyle(estiloCelda);
                cell.setCellValue(new HSSFRichTextString(descrip));

                String costo = String.valueOf(p.getCosto());
                cell = row.createCell((short) columna++);
                cell.setCellStyle(estiloCelda);
                cell.setCellValue(new HSSFRichTextString(costo));

                String precio = String.valueOf(p.getPrecio());
                cell = row.createCell((short) columna++);
                cell.setCellStyle(estiloCelda);
                cell.setCellValue(new HSSFRichTextString(precio));

                String tipo = p.getTipo().getNomtipo().toString();
                cell = row.createCell((short) columna++);
                cell.setCellStyle(estiloCelda);
                cell.setCellValue(new HSSFRichTextString(tipo));

                String categoria = p.getCategoria().getDescrip().toString();
                cell = row.createCell((short) columna++);
                cell.setCellStyle(estiloCelda);
                cell.setCellValue(new HSSFRichTextString(categoria));
            }
        } catch (Exception e) {
            HSSFRow row = sheet.createRow((short) fila++);
            HSSFCell cell = row.createCell((short) 0);
            cell.setCellValue(new HSSFRichTextString(e.getMessage()));
        } finally {
            return workbook;
        }
    }


    @SuppressWarnings({"finally", "deprecation"})
    public HSSFWorkbook generarIngredientesReporteExcel() {
        HSSFWorkbook workbook = new HSSFWorkbook();
        HSSFSheet sheet = workbook.createSheet("Reporte");
        int fila = 1;
        int columna = 0;
        try {

            HSSFCellStyle estiloCabecera = workbook.createCellStyle();
            estiloCabecera.setAlignment(HSSFCellStyle.ALIGN_CENTER);
            estiloCabecera.setFillForegroundColor(HSSFColor.BLACK.index);
            estiloCabecera.setFillBackgroundColor(HSSFColor.WHITE.index);
            //estiloCabecera.setFillPattern(HSSFCellStyle.BORDER_THIN);
            //estiloCabecera.setBorderBottom(HSSFCellStyle.BORDER_THIN);

            String[] arregloCabecera = new String[]{"CODIGO", "DESCRIPCION", "COSTO", "UNIDAD"};

            HSSFRow row = sheet.createRow((short) fila++);
            HSSFCell cell = null;
            for (Iterator<String> iter = Arrays.asList(arregloCabecera).iterator(); iter.hasNext();) {
                String string = iter.next();

                cell = row.createCell((short) columna++);
                cell.setCellStyle(estiloCabecera);
                cell.setCellValue(new HSSFRichTextString(string));
            }

            List<Ingrediente> ingredientes = ingredienteDao.obtenerIngredientes();
            //No tiene porque generar lo demas si no hay datos
            if (ingredientes.size() == 1) {
                return workbook;
            }

            HSSFCellStyle estiloCelda = workbook.createCellStyle();
            estiloCelda.setAlignment(HSSFCellStyle.ALIGN_RIGHT);


            for (Ingrediente i : ingredientes) {
                row = sheet.createRow((short) fila++);
                columna = 0;
                String codigo = i.getIding().toString();
                cell = row.createCell((short) columna++);
                cell.setCellStyle(estiloCelda);
                cell.setCellValue(new HSSFRichTextString(codigo));

                String descrip = i.getDesing().toString();
                cell = row.createCell((short) columna++);
                cell.setCellStyle(estiloCelda);
                cell.setCellValue(new HSSFRichTextString(descrip));

                String costo = String.valueOf(i.getCosto());
                cell = row.createCell((short) columna++);
                cell.setCellStyle(estiloCelda);
                cell.setCellValue(new HSSFRichTextString(costo));

                String unidad = i.getUnidad().getUnicod().toString();
                cell = row.createCell((short) columna++);
                cell.setCellStyle(estiloCelda);
                cell.setCellValue(new HSSFRichTextString(unidad));

            }
        } catch (Exception e) {
            HSSFRow row = sheet.createRow((short) fila++);
            HSSFCell cell = row.createCell((short) 0);
            cell.setCellValue(new HSSFRichTextString(e.getMessage()));
        } finally {
            return workbook;
        }
    }

}
